var express = require('express');
var router = express.Router();
var http = require('http');
const https = require('https')
var cheerio = require('cheerio');
var loggerInfo = require('../utils/winston-date').logger;// 自定义打印 包含日志文件分割功能
var loggerError = require('../utils/winston-date').loggerError;// 自定义打印 包含日志文件分割功能
var iconv = require('iconv-lite');
let db = require('../utils/db');//打开数据库连接
let connection = db.connection();//打开数据库连接
var hcsy = require('../utils/hcsy-date');//引用自己的文件
let appConfig = require('../utils/app-config');//基础配置
var request = require('request');// 请求 第三方Api


/* GET home page. */
router.get('/', function (req, res, next) {
    res.render('index', { title: '简单nodejs爬虫' });
});
router.get('/getHtml', function (req, res, next) { // 浏览器端发来get请求
    var url = 'https://www.zrfan.com/2451.html';
    console.log("开始getHtml");
    // res.json({ code: 200, data: "", msg: "" });
    // return;`
    if (req.query.url) {
        url = req.query.url;
        url = "https:" + url;
    }
    loggerInfo.info("抓取地址:", url);
    var hdate = (new Date()).Format("yyyy-MM-dd");
    //先判断数据库里是否已有数据，有则到数据库里取，没有则去爬取
    connection.query("SELECT * FROM `yh` where date ='" + hdate + "'", function (ce, cd, cf) {
        //loggerInfo.info(ce, cd, cf);
        if (ce) {
            loggerError.error(ce);
        }
        if (cd && cd.length > 0) {
            var dataArr = [];
            loggerInfo.info("数据库已有数据");
            var yArr = cd;
            var obj = {
                key: null,
                value: []
            }
            yArr.forEach(function (kv, ki, ka) {
                if (!obj.key) {
                    obj.key = kv.key;
                }
                if (obj.key != kv.key) {
                    dataArr.push(obj);
                    obj = {
                        key: null,
                        value: []
                    }
                    obj.key = kv.key;
                }
                if (obj.key == kv.key) {
                    obj.value.push(kv.value);
                }
            })
            res.json({ code: 200, data: dataArr, msg: "" });
            return;
        }
        loggerInfo.info("没有数据，需要抓取");
        https.get(url, function (sres) {
            var chunks = [];
            sres.on('data', function (chunk) {
                chunks.push(chunk);
            });
            //loggerInfo.info("getJobs2-ondatachunk", chunks);
            // chunks里面存储着网页的 html 内容，将它转码传给 cheerio.load 之后
            // 就可以得到一个实现了 jQuery 接口的变量，将它命名为 `$`
            // 剩下就都是 jQuery 的内容了
            sres.on('end', function () {
                var titles = [];
                //由于咱们发现此网页的编码格式为gb2312，所以需要对其进行转码，否则乱码
                //依据：“<meta http-equiv="Content-Type" content="text/html; charset=gb2312">”
                var html = iconv.decode(Buffer.concat(chunks), 'UTF-8');
                //loggerInfo.info("getJobs2-onendchunk", html);
                var $ = cheerio.load(html, { decodeEntities: false });
                var yhArr = [];
                //var yhArrg = [];
                var h2num = 0, blockquoteNum = 0;//节点
                var ehNum = 0;
                var obj = {
                    key: null,
                    value: []
                };
                // var objg = {
                //     key: null,
                //     value: []
                // };
                var pdAdd = false;
                var length = $('.single-content').children().length;
                for (var i = 0; i < length; i++) {
                    var hel = $('.single-content').children()[i];//获取节点
                    var helg = $('.single-content').children().eq(i + 1);//获取节点
                    //loggerInfo.info("节点" + i + "", hel.name);
                    try {
                        if (hel.name == "h2") {
                            //console.log(123456);
                            if (ehNum != 0) {
                                console.log("ehNum != 0");
                                yhArr.push(obj);
                                //yhArrg.push(objg);
                                obj = {
                                    key: null,
                                    value: []
                                };
                                objg = {
                                    key: null,
                                    value: []
                                };
                                //loggerInfo.info("加入", yhArr);
                            }
                            obj.key = $('.single-content').find("h2").eq(h2num).text();
                            h2num++;
                            ehNum = i;
                            //objg.key = helg.text();
                        }
                        if (i > ehNum && hel.name == "blockquote") {
                            obj.value.push($('.single-content').find("blockquote").eq(blockquoteNum).text());
                            blockquoteNum++;
                            //objg.value.push(helg.text());
                        } else {
                            //loggerInfo.info("--------------------------------");
                            //loggerInfo.info(ehNum, i, obj, yhArr);
                        }
                    } catch (error) {
                        loggerError.error(error);
                    }
                }
                res.json({ code: 200, data: yhArr, msg: "" });
                var sql = "";
                /*在数据库中存储 */
                yhArr.forEach(function (v, i, a) {
                    var valueArr = v.value;
                    valueArr.forEach(function (sv, si, sa) {
                        sql = "INSERT INTO `yh` (`date`, `key`, `value`) VALUES ('" + hdate + "','" + v.key + "', '" + sv + "');";
                        loggerInfo.info(sql);
                        connection.query(sql, function (e, d, f) {
                            if (e) {
                                loggerError.error(e);
                            }
                        })
                    });
                })
            });
        });
    })
});

//获取当日的链接
router.get("/getTodeyUrl", function (req, res, next) {
    var url = 'https://www.zrfan.com/category/zhinan/';
    https.get(url, function (sres) {
        var chunks = [];
        sres.on('data', function (chunk) {
            chunks.push(chunk);
        });
        //loggerInfo.info("getJobs2-ondatachunk", chunks);
        // chunks里面存储着网页的 html 内容，将它转码传给 cheerio.load 之后
        // 就可以得到一个实现了 jQuery 接口的变量，将它命名为 `$`
        // 剩下就都是 jQuery 的内容了
        sres.on('end', function () {
            //由于咱们发现此网页的编码格式为gb2312，所以需要对其进行转码，否则乱码
            //依据：“<meta http-equiv="Content-Type" content="text/html; charset=gb2312">”
            var html = iconv.decode(Buffer.concat(chunks), 'UTF-8');
            //loggerInfo.info("getJobs2-onendchunk", html);
            var $ = cheerio.load(html, { decodeEntities: false });
            var href = "";
            try {
                href = $("#primary").find("article").eq(0).find("a").eq(2)[0].attribs.href;
                href = href.substring(2, href.length);
                console.log(href);
            } catch (error) {
                loggerError.error(error);
                res.json(Object.assign(appConfig.errorJson(), { data: error }));
                return;
            }
            loggerInfo.info(href);
            res.json(Object.assign(appConfig.successJson(), { data: href }));
        })
    })
})
/**
 * 京东价格
 */
//获取京东价格该商品价格
router.get("/getPriceFromJD1", function (req, res, next) {
    var url = 'https://item.jd.com/19080285577.html';
    https.get(url, function (sres) {
        var chunks = [];
        sres.on('data', function (chunk) {
            chunks.push(chunk);
        });
        console.log("开始");
        //loggerInfo.info("getJobs2-ondatachunk", chunks);
        // chunks里面存储着网页的 html 内容，将它转码传给 cheerio.load 之后
        // 就可以得到一个实现了 jQuery 接口的变量，将它命名为 `$`
        // 剩下就都是 jQuery 的内容了
        sres.on('end', function () {
            //由于咱们发现此网页的编码格式为gb2312，所以需要对其进行转码，否则乱码
            //依据：“<meta http-equiv="Content-Type" content="text/html; charset=gb2312">”
            var html = iconv.decode(Buffer.concat(chunks), 'gbk');
            //loggerInfo.info("getJobs2-onendchunk", html);
            var $ = cheerio.load(html, { decodeEntities: false });
            var Price = "";
            try {
                Price = $(".J-p-19080285577").text();
                console.log($(".sku-name").html());
                loggerInfo.info("商品名称", $(".sku-name").html());
                loggerInfo.info("商品价格", $(".J-summary-price").html());
                console.log("抓取价格", Price);
            } catch (error) {
                loggerError.error(error);
                res.json(Object.assign(appConfig.errorJson(), { data: error }));
                return;
            }
            loggerInfo.info(Price);
            res.json(Object.assign(appConfig.successJson(), { data: Price }));
        })
    })
})
/**
 * 京东价格
 * productId: 商品Id（必须）
 * userId: 用户id（必须）
 * addPrice: 添加时的价格（可不传，默认添加时抓取的价格）
 * price ：提醒价格（可不传）
 * vipState : 0 ：普通价 1：会员价（必须）	
 */
//获取京东该商品价格
router.post("/addPriceFromJD", function (req, res, next) {
    var productId = req.body.productId;
    var userId = req.body.userId;
    var addPrice = req.body.addPrice?req.body.addPrice:"0";
    var price = req.body.price?req.body.price:"0";
    var vipState = req.body.vipState;
    

    if (!productId) {
        res.json(Object.assign(appConfig.errorJson(), { msg: '商品Id不能为空' }));
    }
    if (!userId) {
        res.json(Object.assign(appConfig.errorJson(), { msg: '用户Id不能为空' }));
    }
    if (!vipState) {
        res.json(Object.assign(appConfig.errorJson(), { msg: 'vipState不能为空' }));
    }
    loggerInfo.info("参数信息", "productId:" + productId, "userId:" + userId, "addPrice:" + addPrice, "price:" + price, "vipState:" + vipState);
    var priceUrl = 'https://p.3.cn/prices/mgets?skuIds=J_' + productId;//价格url 用来获取商品价格
    var productUrl = 'https://item.jd.com/' + productId + '.html';//商品url 用来获取商品名称
    var e = request({
        url: priceUrl,
        method: 'GET',
        headers: { 'Content-Type': 'text/json' }
    }, function (error, response, body) {
        if (!error && response.statusCode == 200) {
            var priceResult = JSON.parse(body);//抓取到价格
            priceResult=priceResult[0];
            loggerInfo.info("商品价格抓取结果",priceResult);
            // res.render('task', { 'data': JSON.parse(body) });
            // res.json(Object.assign(appConfig.successJson(), { data: JSON.parse(body) }));
            var url = 'https://item.jd.com/19080285577.html';
            https.get(url, function (sres) {
                var chunks = [];
                sres.on('data', function (chunk) {
                    chunks.push(chunk);
                });
                //loggerInfo.info("getJobs2-ondatachunk", chunks);
                // chunks里面存储着网页的 html 内容，将它转码传给 cheerio.load 之后
                // 就可以得到一个实现了 jQuery 接口的变量，将它命名为 `$`
                // 剩下就都是 jQuery 的内容了
                sres.on('end', function () {
                    //由于咱们发现此网页的编码格式为gb2312，所以需要对其进行转码，否则乱码
                    //依据：“<meta http-equiv="Content-Type" content="text/html; charset=gb2312">”
                    var html = iconv.decode(Buffer.concat(chunks), 'gbk');
                    //loggerInfo.info("getJobs2-onendchunk", html);
                    var $ = cheerio.load(html, { decodeEntities: false });
                    var productName = "";//商品名称
                    try {
                        productName = $(".sku-name").html().trim();
                        loggerInfo.info("商品名称抓取结果",productName);
                        //将数据存储到数据库
                        var currentPrice = addPrice;
                        var currentPriceToVIP = addPrice;
                        if (currentPrice==0 && vipState == 0) {
                            currentPrice = priceResult.p;// 普通价格
                        }
                        if (currentPriceToVIP==0 && vipState == 1) {
                            if(priceResult.tpp){
                                currentPriceToVIP = priceResult.tpp;// plus价格
                            }else{
                                currentPriceToVIP=0;
                            }
                        }
                        loggerInfo.info("priceResult.p:::::::",priceResult.p);
                        //判断数据库里面是否已有该商品
                        var querySQL = 'SELECT *  FROM `JDproduct` WHERE productId=' + productId + '';
                        loggerInfo.info("querySQL：》》》》",querySQL);
                        var addProductSQL = 'INSERT INTO `JDproduct` (`productId`, `productName`, `currentPrice`, `currentPriceToVIP`, `creaTime`, `updateTime`) VALUES (' + productId + ', "' + productName + '", "' + currentPrice + '", "' + currentPriceToVIP + '", now(), now());'
                        connection.query(querySQL, function (e, d, f) {
                            if (e) {
                                loggerError.error("判断数据库里面是否已有该商品查询出错" + productId, e);
                                res.json(Object.assign(appConfig.errorJson(), { msg: "系统出错" }));
                            }
                            loggerInfo.info("判断是否存在商品：",d);
                            //当数据已经存在
                            if (d&&d.length>0) {
                                addProductSQL = 'UPDATE `JDproduct` SET `currentPrice`="'+currentPrice+'", `currentPriceToVIP`="'+currentPriceToVIP+'", `updateTime`=now() WHERE (`productId`=' + productId + ');';
                            }
                            loggerInfo.info("addProductSQL：》》》》",addProductSQL);
                            connection.query(addProductSQL, function (ce, cd, cf) {
                                loggerInfo.info("执行》》《《ce》《ce》《ce》《ce》《》《》《》",ce);
                                if (ce) {
                                    loggerError.error("插入或更新商品信息时出错" + productId, ce);
                                    res.json(Object.assign(appConfig.errorJson(), { msg: "系统出错" }));
                                } else {
                                    //将数据绑定到 用户商品关联表 关系已存在则 直接更新 ，不存在则新增
                                    var addProductToUserSQL = 'INSERT INTO `JDproductToUser` (`userId`, `productId`, `price`, `addPrice`, `vipState`) VALUES (' + userId + ',' + productId + ',' + price + ',' + addPrice + ',' + vipState + ');';
                                    connection.query('SELECT * FROM `JDproductToUser` WHERE userId=' + userId + ' and productId=' + productId + '', function (se, sd, sf) {
                                        loggerInfo.info("执行》》《《se》《se》《se》《》《》《》《》",se);
                                        if (se) {
                                            loggerError.error("查询商品与用户关系时出错" + productId, se);
                                            res.json(Object.assign(appConfig.errorJson(), { msg: "系统出错" }));
                                        }
                                        if (sd&&sd.length>0) {
                                            var JDproductToUserResutl = JSON.parse(sd);//
                                            var sAddPrice = addPrice;
                                            if (sAddPrice==0 && vipState == 0) {
                                                sAddPrice = priceResult.p;// 普通价格
                                            }
                                            if (sAddPrice==0 && vipState == 1) {
                                                sAddPrice = priceResult.tpp;// plus价格
                                            }
                                            var sPrice = price;//提醒价格
                                            if (!sPrice) {
                                                sPrice = JDproductToUserResutl.price;
                                            }
                                            addProductToUserSQL = 'UPDATE `JDproductToUser` SET `price`='+sPrice+', `addPrice`=' + sAddPrice + ', `vipState`=' + vipState + ' WHERE `userId`=' + userId + ' and `productId`=' + productId + '';
                                        }
                                        loggerInfo.info("addProductToUserSQL：》》》》",addProductToUserSQL);
                                        connection.query(addProductToUserSQL, function (ae, ad, af) {
                                            if (ae) {
                                                loggerError.error("插入或更新商品与用户关系时出错" + productId, ae);
                                                res.json(Object.assign(appConfig.errorJson(), { msg: "系统出错" }));
                                            }
                                            res.json(Object.assign(appConfig.successJson(), { msg: "操作成功" }));
                                        });
                                    })
                                }
                            });
                        });
                        // res.json(Object.assign(appConfig.successJson(), { msg: "添加成功" }));
                    } catch (error) {
                        loggerError.error(error);
                        res.json(Object.assign(appConfig.errorJson(), { data: error }));
                        return;
                    }
                })
            })
        } else {
            loggerError.error(productId + "商品价格获取失败", error);
            res.json(Object.assign(appConfig.errorJson(), { msg: '系统错误' }));
        }
    });
})
module.exports = router;